#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/9/4 8:44
# @Author  : afraidbenq
# @File    : decorators.py
# @Software: PyCharm
# @Github  : github/afraidbenq
# @Email   : 329189987@qq.com
# @Desc    :
"""
事半功倍的装饰器
"""
import time
import warnings

import matplotlib.pyplot as plt


def timer(func):
    """
    测量执行时间
    @timer
    def my_data_processing_function():
        # Your data processing code here
    """

    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time:.2f} seconds to execute.")
        return result

    return wrapper


def memoize(func):
    """
    缓存结果
    @memoize
    def fibonacci(n):
        if n <= 1:
            return n
        return fibonacci(n - 1) + fibonacci(n - 2)
    """
    cache = {}

    def wrapper(*args):
        if args in cache:
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result

    return wrapper


def validate_input(func):
    """
    验证函数的输入
    @validate_input
    def analyze_data(data):
        # Your data analysis code here
    """

    def wrapper(*args, **kwargs):
        # Your data validation logic here
        valid_data = True
        if valid_data:
            return func(*args, **kwargs)
        else:
            raise ValueError("Invalid data. Please check your inputs.")

    return wrapper


def log_results(func):
    """
    日志输出
    @log_results
    def calculate_metrics(data):
        # Your metric calculation code here
    """

    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        with open("results.log", "a") as log_file:
            log_file.write(f"{func.__name__} - Result: {result}\n")
        return result

    return wrapper


def suppress_errors(func):
    """
    优雅的错误处理
    @suppress_errors
    def preprocess_data(data):
        # Your data preprocessing code here
    """

    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print(f"Error in {func.__name__}: {e}")
            return None

    return wrapper


def validate_output(func):
    """
    验证函数的输出
    @validate_output
    def clean_data(data):
       # Your data cleaning code here
    """

    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)

        # Your data validation logic here
        def valid_output(result):
            return True

        if valid_output(result):
            return result
        else:
            raise ValueError("Invalid output. Please check your function logic.")

    return wrapper


def retry(max_attempts, delay):
    """
    重试执行
    @retry(max_attempts=3, delay=2)
    def fetch_data_from_api(api_url):
        # Your API data fetching code here
    """

    def decorator(func):
        def wrapper(*args, **kwargs):
            attempts = 0
            while attempts < max_attempts:
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"Attempt {attempts + 1} failed. Retrying in {delay} seconds.")
                    attempts += 1
                    time.sleep(delay)
            raise Exception("Max retry attempts exceeded.")

        return wrapper

    return decorator


def visualize_results(func):
    """
    漂亮的可视化
    @visualize_results
    def analyze_and_visualize(data):
        # Your combined analysis and visualization code here
    """

    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        plt.figure()
        # Your visualization code here
        plt.show()
        return result

    return wrapper


def debug(func):
    """
    调试变得容易
    @debug
    def complex_data_processing(data, threshold=0.5):
        # Your complex data processing code here
    """

    def wrapper(*args, **kwargs):
        print(f"Debugging {func.__name__} - args: {args}, kwargs: {kwargs}")
        return func(*args, **kwargs)

    return wrapper


def deprecated(func):
    """
    处理废弃的函数
    @deprecated
    def old_data_processing(data):
        # Your old data processing code here
    """

    def wrapper(*args, **kwargs):
        warnings.warn(f"{func.__name__} is deprecated and will be removed in future versions.", DeprecationWarning)
        return func(*args, **kwargs)

    return wrapper
